package com.bh.观察者模式.天气预报案例;


/**
 * @author ：HB
 * @date ：Created in 2021/7/22 21:21
 * @description： 观察者模式的主要角色如下。
 * 1. 抽象主题（Subject）角色：也叫抽象目标类，它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法，以及通知所有观察者的抽象方法。
 * 2. 具体主题（Concrete Subject）角色：也叫具体目标类，它实现抽象目标中的通知方法，当具体主题的内部状态发生改变时，通知所有注册过的观察者对象。
 * 3. 抽象观察者（Observer）角色：它是一个抽象类或接口，它包含了一个更新自己的抽象方法，当接到具体主题的更改通知时被调用。
 * 4. 具体观察者（Concrete Observer）角色：实现抽象观察者中定义的抽象方法，以便在得到目标的更改通知时更新自身的状态。
 *
 * “按下开关，台灯灯亮”
 * 在这个事件中，台灯作为观察者，开关作为被观察者，台灯透过电线来观察开关的状态来并做出相应的处理
 * Subject(被观察者):作为事件的产生方（生产“开”和“关”这两个事件），是主动的，是整个开灯事理流程的起点。
 * Observer(观察者):作为事件的处理方（处理“灯亮”和“灯灭”这两个事件），是被动的，是整个开灯事件流程的终点。
 * 在起点和终点之间的过程，事件传递的过程中是可以被加工，过滤，转换，合并等等方式处理的.
 *
 *
 * 天气预报的理解：
 *  WeatherData：天气预报的数据，实现了Subject接口。
 *  CurrentConditions： 具体观察者，观察到WeatherData的数据变化，会更新数据
 */

public class Client {
    public static void main(String[] args) {
        //事件生产者，被观察者
        WeatherData weatherData = new WeatherData();
        //观察者 这里比如就是百度客户端去观察气象局的天气预报数据，如果天气预报的数据有修改就将数据更新到百度客户端
        CurrentConditions currentConditions = new CurrentConditions();
        //将观察者和被观察者建立联系
        weatherData.registerObserver(currentConditions);
        //模拟气象局的数据有修改，这里百度客户端就会自动将数据更新到客户端，因为他做为观察者，时刻的观察着气象局的天气预报的数据
        weatherData.setData(10.0f,20.3f,6.0f);
    }
}
